from sqlalchemy import select, desc
from sqlalchemy.orm import Session

from 数据库 import 虎码, 获取会话 
from 统计 import 检测全码重


def 设置一简():
    # 清理原有一简
    with 获取会话() as 会话:
        表 = 会话.execute(
            select(虎码)
            .where(虎码.一简.is_(None))
        ).scalars()
        for 行 in 表:
            行.一简 = None

    # 重新设置一简
    with 获取会话() as 会话:
        一简 = {}
        表 = 会话.execute(
            select(虎码)
            # .where(虎码.级别.in_(['1', '2']))
            .order_by(desc(虎码.频数))
        ).scalars()
        for 行 in 表:
            if 行.全码[0] not in 一简:
                一简[行.全码[0]] = 行
        
        for 行 in 一简.values():
            行.一简 = 行.全码[0]
            
        return ''.join([行.字符 for 行 in 一简.values()])
    

    

def 清理二三简():
    with 获取会话() as 会话:
        表 = 会话.execute(
            select(虎码)
        ).scalars()
        for 行 in 表:
            行.二简 = None
            行.三简 = None


def 设置二简(二重权重 = 1, 三重权重 = 1, 全重权重 = 1):
    全码重 = 检测全码重(3500)
    全码重 = set().union(*全码重.values())
    with 获取会话() as 会话:
        三码 = {}
        二码 = {}
        表 = 会话.execute(
            select(虎码)
            .where(虎码.频数 > 0)
            .where(虎码.一简.is_(None))
            .where(虎码.二简.is_(None))
            .order_by(desc(虎码.频数))
        ).scalars()
        for 行 in 表:
            三码.setdefault(行.全码[:3], []).append(行)
        
        for 键, 三码列表 in 三码.items():
            二码.setdefault(键[:2], []).append(三码列表)  

        for 键, 三码列表列表 in 二码.items():
            权重表 = [1, 二重权重, 三重权重]
            最大权数 = 0
            最大权数三码列表 = []

            for 三码列表 in 三码列表列表:
                权数 = 0
                for i in range(len(三码列表)):
                    if i >= 3:
                        break
                    权数 += 权重表[i]* 三码列表[i].频数 * (全重权重 if 三码列表[i].字符 in 全码重 else 1)
                
                if 权数 > 最大权数:
                    最大权数 = 权数
                    最大权数三码列表 = 三码列表
            if 最大权数三码列表[0].频数 >= 1648:
                最大权数三码列表[0].二简 = 键
            # elif len(最大权数三码列表) > 1 and 最大权数三码列表[1].频数 >= 1648:
            #     最大权数三码列表[1].二简 = 键



def 设置三简():
    with 获取会话() as 会话:
        三全码 = set()
        表 = 会话.execute(
            select(虎码)
            .order_by(desc(虎码.频数))
            .limit(6000)
        ).scalars()
        for 行 in 表:
            if 行.一简 is None and 行.二简 is None and len(行.全码) == 3:
                三全码.add(行.全码)
        三码表 = {}
        表 = 会话.execute(
            select(虎码)
            .where(虎码.一简.is_(None))
            .where(虎码.二简.is_(None))
            .order_by(desc(虎码.频数))
        ).scalars()

        for 行 in 表:
            三码表.setdefault(行.全码[:3], []).append(行)

        for 键, 行列表 in 三码表.items():
            if 行列表[0].全码 != 键 and 键 not in 三全码:
                行列表[0].三简 = 键



if __name__ == '__main__':
    from 写码 import 写码
    写码()
    设置一简()
    设置二简()